R Markdown

This is an R Markdown document. Markdown is a simple formatting syntax for authoring HTML, PDF, and MS Word documents. For more details on using R Markdown see http://rmarkdown.rstudio.com.

When you click the Knit button a document will be generated that includes both content as well as the output of any embedded R code chunks within the document. You can embed an R code chunk like this:

library(Seurat)
library(tidyverse)
library(here)
source(here('vignettes', 'bcells', 'common.R'))
Parsed with column specification:
cols(
  `MGI Gene/Marker ID` = col_character(),
  Symbol = col_character(),
  Name = col_character(),
  Chr = col_character(),
  Qualifier = col_character(),
  `Annotated Term` = col_character(),
  Context = col_character(),
  Proteoform = col_character(),
  Evidence = col_character(),
  `Inferred From` = col_character(),
  `Reference(s)` = col_character(),
  category = col_character()
)
load(here('vignettes', 'bcells', 'droplet_cd19.Robj'))
cluster.markers = FindAllMarkers(object = tiss_droplet_cd19, only.pos = TRUE, min.pct = 0.25, thresh.use = 0.25)

   |                                                  | 0 % ~calculating  
   |+                                                 | 1 % ~16s          
   |++                                                | 2 % ~14s          
   |++                                                | 4 % ~13s          
   |+++                                               | 5 % ~13s          
   |+++                                               | 6 % ~12s          
   |++++                                              | 7 % ~12s          
   |+++++                                             | 8 % ~12s          
   |+++++                                             | 9 % ~12s          
   |++++++                                            | 11% ~11s          
   |++++++                                            | 12% ~11s          
   |+++++++                                           | 13% ~11s          
   |++++++++                                          | 14% ~11s          
   |++++++++                                          | 15% ~11s          
   |+++++++++                                         | 16% ~11s          
   |+++++++++                                         | 18% ~10s          
   |++++++++++                                        | 19% ~10s          
   |++++++++++                                        | 20% ~10s          
   |+++++++++++                                       | 21% ~10s          
   |++++++++++++                                      | 22% ~10s          
   |++++++++++++                                      | 24% ~10s          
   |+++++++++++++                                     | 25% ~09s          
   |+++++++++++++                                     | 26% ~09s          
   |++++++++++++++                                    | 27% ~09s          
   |+++++++++++++++                                   | 28% ~09s          
   |+++++++++++++++                                   | 29% ~09s          
   |++++++++++++++++                                  | 31% ~09s          
   |++++++++++++++++                                  | 32% ~09s          
   |+++++++++++++++++                                 | 33% ~08s          
   |++++++++++++++++++                                | 34% ~08s          
   |++++++++++++++++++                                | 35% ~08s          
   |+++++++++++++++++++                               | 36% ~08s          
   |+++++++++++++++++++                               | 38% ~08s          
   |++++++++++++++++++++                              | 39% ~08s          
   |++++++++++++++++++++                              | 40% ~07s          
   |+++++++++++++++++++++                             | 41% ~07s          
   |++++++++++++++++++++++                            | 42% ~07s          
   |++++++++++++++++++++++                            | 44% ~07s          
   |+++++++++++++++++++++++                           | 45% ~07s          
   |+++++++++++++++++++++++                           | 46% ~07s          
   |++++++++++++++++++++++++                          | 47% ~07s          
   |+++++++++++++++++++++++++                         | 48% ~06s          
   |+++++++++++++++++++++++++                         | 49% ~06s          
   |++++++++++++++++++++++++++                        | 51% ~06s          
   |++++++++++++++++++++++++++                        | 52% ~06s          
   |+++++++++++++++++++++++++++                       | 53% ~06s          
   |++++++++++++++++++++++++++++                      | 54% ~06s          
   |++++++++++++++++++++++++++++                      | 55% ~06s          
   |+++++++++++++++++++++++++++++                     | 56% ~05s          
   |+++++++++++++++++++++++++++++                     | 58% ~05s          
   |++++++++++++++++++++++++++++++                    | 59% ~05s          
   |++++++++++++++++++++++++++++++                    | 60% ~05s          
   |+++++++++++++++++++++++++++++++                   | 61% ~05s          
   |++++++++++++++++++++++++++++++++                  | 62% ~05s          
   |++++++++++++++++++++++++++++++++                  | 64% ~04s          
   |+++++++++++++++++++++++++++++++++                 | 65% ~04s          
   |+++++++++++++++++++++++++++++++++                 | 66% ~04s          
   |++++++++++++++++++++++++++++++++++                | 67% ~04s          
   |+++++++++++++++++++++++++++++++++++               | 68% ~04s          
   |+++++++++++++++++++++++++++++++++++               | 69% ~04s          
   |++++++++++++++++++++++++++++++++++++              | 71% ~04s          
   |++++++++++++++++++++++++++++++++++++              | 72% ~03s          
   |+++++++++++++++++++++++++++++++++++++             | 73% ~03s          
   |++++++++++++++++++++++++++++++++++++++            | 74% ~03s          
   |++++++++++++++++++++++++++++++++++++++            | 75% ~03s          
   |+++++++++++++++++++++++++++++++++++++++           | 76% ~03s          
   |+++++++++++++++++++++++++++++++++++++++           | 78% ~03s          
   |++++++++++++++++++++++++++++++++++++++++          | 79% ~03s          
   |++++++++++++++++++++++++++++++++++++++++         | 80% ~02s          
   |+++++++++++++++++++++++++++++++++++++++++         | 81% ~02s          
   |++++++++++++++++++++++++++++++++++++++++++        | 82% ~02s          
   |++++++++++++++++++++++++++++++++++++++++++        | 84% ~02s          
   |+++++++++++++++++++++++++++++++++++++++++++       | 85% ~02s          
   |+++++++++++++++++++++++++++++++++++++++++++       | 86% ~02s          
   |++++++++++++++++++++++++++++++++++++++++++++      | 87% ~02s          
   |+++++++++++++++++++++++++++++++++++++++++++++     | 88% ~01s          
   |+++++++++++++++++++++++++++++++++++++++++++++     | 89% ~01s          
   |++++++++++++++++++++++++++++++++++++++++++++++    | 91% ~01s          
   |++++++++++++++++++++++++++++++++++++++++++++++    | 92% ~01s          
   |+++++++++++++++++++++++++++++++++++++++++++++++   | 93% ~01s          
   |++++++++++++++++++++++++++++++++++++++++++++++++  | 94% ~01s          
   |++++++++++++++++++++++++++++++++++++++++++++++++  | 95% ~01s          
   |+++++++++++++++++++++++++++++++++++++++++++++++++ | 96% ~00s          
   |+++++++++++++++++++++++++++++++++++++++++++++++++ | 98% ~00s          
   |++++++++++++++++++++++++++++++++++++++++++++++++++| 99% ~00s          
   |++++++++++++++++++++++++++++++++++++++++++++++++++| 100% elapsed = 12s

   |                                                  | 0 % ~calculating  
   |+                                                 | 2 % ~09s          
   |++                                                | 3 % ~09s          
   |+++                                               | 5 % ~08s          
   |++++                                              | 6 % ~08s          
   |++++                                              | 8 % ~08s          
   |+++++                                             | 10% ~08s          
   |++++++                                            | 11% ~08s          
   |+++++++                                           | 13% ~08s          
   |++++++++                                          | 14% ~08s          
   |++++++++                                          | 16% ~07s          
   |+++++++++                                         | 17% ~07s          
   |++++++++++                                        | 19% ~07s          
   |+++++++++++                                       | 21% ~07s          
   |++++++++++++                                      | 22% ~07s          
   |++++++++++++                                      | 24% ~07s          
   |+++++++++++++                                     | 25% ~07s          
   |++++++++++++++                                    | 27% ~07s          
   |+++++++++++++++                                   | 29% ~06s          
   |++++++++++++++++                                  | 30% ~06s          
   |++++++++++++++++                                  | 32% ~06s          
   |+++++++++++++++++                                 | 33% ~06s          
   |++++++++++++++++++                                | 35% ~06s          
   |+++++++++++++++++++                               | 37% ~06s          
   |++++++++++++++++++++                              | 38% ~06s          
   |++++++++++++++++++++                              | 40% ~05s          
   |+++++++++++++++++++++                             | 41% ~05s          
   |++++++++++++++++++++++                            | 43% ~05s          
   |+++++++++++++++++++++++                           | 44% ~05s          
   |++++++++++++++++++++++++                          | 46% ~05s          
   |++++++++++++++++++++++++                          | 48% ~05s          
   |+++++++++++++++++++++++++                         | 49% ~05s          
   |++++++++++++++++++++++++++                        | 51% ~04s          
   |+++++++++++++++++++++++++++                       | 52% ~04s          
   |+++++++++++++++++++++++++++                       | 54% ~04s          
   |++++++++++++++++++++++++++++                      | 56% ~04s          
   |+++++++++++++++++++++++++++++                     | 57% ~04s          
   |++++++++++++++++++++++++++++++                    | 59% ~04s          
   |+++++++++++++++++++++++++++++++                   | 60% ~04s          
   |+++++++++++++++++++++++++++++++                   | 62% ~03s          
   |++++++++++++++++++++++++++++++++                  | 63% ~03s          
   |+++++++++++++++++++++++++++++++++                 | 65% ~03s          
   |++++++++++++++++++++++++++++++++++                | 67% ~03s          
   |+++++++++++++++++++++++++++++++++++               | 68% ~03s          
   |+++++++++++++++++++++++++++++++++++               | 70% ~03s          
   |++++++++++++++++++++++++++++++++++++              | 71% ~03s          
   |+++++++++++++++++++++++++++++++++++++             | 73% ~02s          
   |++++++++++++++++++++++++++++++++++++++            | 75% ~02s          
   |+++++++++++++++++++++++++++++++++++++++           | 76% ~02s          
   |+++++++++++++++++++++++++++++++++++++++           | 78% ~02s          
   |++++++++++++++++++++++++++++++++++++++++          | 79% ~02s          
   |+++++++++++++++++++++++++++++++++++++++++         | 81% ~02s          
   |++++++++++++++++++++++++++++++++++++++++++        | 83% ~02s          
   |+++++++++++++++++++++++++++++++++++++++++++       | 84% ~01s          
   |+++++++++++++++++++++++++++++++++++++++++++       | 86% ~01s          
   |++++++++++++++++++++++++++++++++++++++++++++      | 87% ~01s          
   |+++++++++++++++++++++++++++++++++++++++++++++     | 89% ~01s          
   |++++++++++++++++++++++++++++++++++++++++++++++    | 90% ~01s          
   |+++++++++++++++++++++++++++++++++++++++++++++++   | 92% ~01s          
   |+++++++++++++++++++++++++++++++++++++++++++++++   | 94% ~01s          
   |++++++++++++++++++++++++++++++++++++++++++++++++  | 95% ~00s          
   |+++++++++++++++++++++++++++++++++++++++++++++++++ | 97% ~00s          
   |++++++++++++++++++++++++++++++++++++++++++++++++++| 98% ~00s          
   |++++++++++++++++++++++++++++++++++++++++++++++++++| 100% elapsed = 09s
cluster.markers %>% group_by(cluster) %>% top_n(-10, p_val_adj)
write_markers(cluster.markers, here('vignettes', 'bcells', 'droplet_cluster_markers.csv'))
top_cluster_markers = cluster.markers %>% group_by(cluster) %>% top_n(-10, p_val_adj)
nCol = 4
plots = FeaturePlot(tiss_droplet_cd19, features.plot = sort(unique(top_cluster_markers$gene)), 
                    do.return = TRUE, nCol = nCol, no.axes=TRUE, 
                    # Light grey to 
                    cols.use=c('lightgrey', '#008080'))

for (p in plots){
  gene_name = p$labels$title
  gene_tissues = top_organ_markers %>% filter(gene == p$labels$title) %>% select(tissue)
  gene_tissues = as.character(as.vector(gene_tissues$tissue))
  print(paste(gene_name, paste(gene_tissues)))
  title = paste0(gene_name, ' (', paste(gene_tissues, sep=', '), ')')
  p = p + labs(title=title)
  plots[[gene_name]] = p
}
Error in eval(lhs, parent, parent) : object 'top_organ_markers' not found

rr organ_markers = find_markers(tiss_droplet_cd19, ‘tissue’) head(organ_markers)

Filter only for tissues with enough cells

rr tissue_cell_counts = table(tiss_droplet_cd19@meta.data$tissue) print(tissue_cell_counts)

tissues_with_enough_cells = tissue_cell_counts[tissue_cell_counts > 50] tissues_with_enough_cells

rr organ_markers_enough_cells = filter(organ_markers, tissue %in% names(tissues_with_enough_cells)) organ_markers_enough_cells

rr top_organ_markers = organ_markers_enough_cells %>% group_by(tissue) %>% top_n(-10, p_val_adj) top_organ_markers

rr write_csv(organ_markers_enough_cells, here(‘vignettes’, ‘bcells’, ‘droplet_tissue_markers.csv’))

rr ggplot(data=organ_markers_enough_cells, aes(x=p_val)) + geom_histogram() + facet_grid(~tissue)

rr ggplot(data=organ_markers_enough_cells, aes(x=p_val_adj)) + geom_histogram() + facet_grid(~tissue)

rr top_organ_markers %>% filter(gene == p\(labels\)title) %>% select(tissue)

rr nCol = 4 plots = FeaturePlot(tiss_droplet_cd19, features.plot = sort(unique(top_organ_markers\(gene)), do.return = TRUE, nCol = nCol, no.axes=TRUE, # Light grey to cols.use=c('lightgrey', '#008080')) for (p in plots){ gene_name = p\)labels\(title gene_tissues = top_organ_markers %>% filter(gene == p\)labels\(title) %>% select(tissue) gene_tissues = as.character(as.vector(gene_tissues\)tissue)) print(paste(gene_name, paste(gene_tissues))) title = paste0(gene_name, ‘(’, paste(gene_tissues, sep=‘,’), ‘)’) p = p + labs(title=title) plots[[gene_name]] = p } plots.combined <- plot_grid(plotlist = plots, ncol = nCol) invisible(x = lapply(X = plots.combined, FUN = print)) ggsave(‘droplet_featureplot_top_organ_markers.pdf’, height = 40, width=15)

LS0tCnRpdGxlOiAiQiBDZWxscyBkcm9wbGV0IgpvdXRwdXQ6IGh0bWxfbm90ZWJvb2sKLS0tCgpgYGB7ciBzZXR1cCwgaW5jbHVkZT1GQUxTRX0Ka25pdHI6Om9wdHNfY2h1bmskc2V0KGVjaG8gPSBUUlVFKQpgYGAKCiMjIFIgTWFya2Rvd24KClRoaXMgaXMgYW4gUiBNYXJrZG93biBkb2N1bWVudC4gTWFya2Rvd24gaXMgYSBzaW1wbGUgZm9ybWF0dGluZyBzeW50YXggZm9yIGF1dGhvcmluZyBIVE1MLCBQREYsIGFuZCBNUyBXb3JkIGRvY3VtZW50cy4gRm9yIG1vcmUgZGV0YWlscyBvbiB1c2luZyBSIE1hcmtkb3duIHNlZSA8aHR0cDovL3JtYXJrZG93bi5yc3R1ZGlvLmNvbT4uCgpXaGVuIHlvdSBjbGljayB0aGUgKipLbml0KiogYnV0dG9uIGEgZG9jdW1lbnQgd2lsbCBiZSBnZW5lcmF0ZWQgdGhhdCBpbmNsdWRlcyBib3RoIGNvbnRlbnQgYXMgd2VsbCBhcyB0aGUgb3V0cHV0IG9mIGFueSBlbWJlZGRlZCBSIGNvZGUgY2h1bmtzIHdpdGhpbiB0aGUgZG9jdW1lbnQuIFlvdSBjYW4gZW1iZWQgYW4gUiBjb2RlIGNodW5rIGxpa2UgdGhpczoKCmBgYHtyfQpsaWJyYXJ5KFNldXJhdCkKbGlicmFyeSh0aWR5dmVyc2UpCmxpYnJhcnkoaGVyZSkKc291cmNlKGhlcmUoJ3ZpZ25ldHRlcycsICdiY2VsbHMnLCAnY29tbW9uLlInKSkKbG9hZChoZXJlKCd2aWduZXR0ZXMnLCAnYmNlbGxzJywgJ2Ryb3BsZXRfY2QxOS5Sb2JqJykpCmBgYAoKCgoKYGBge3J9CmNsdXN0ZXIubWFya2VycyA9IEZpbmRBbGxNYXJrZXJzKG9iamVjdCA9IHRpc3NfZHJvcGxldF9jZDE5LCBvbmx5LnBvcyA9IFRSVUUsIG1pbi5wY3QgPSAwLjI1LCB0aHJlc2gudXNlID0gMC4yNSkKYGBgCgpgYGB7cn0KY2x1c3Rlci5tYXJrZXJzICU+JSBncm91cF9ieShjbHVzdGVyKSAlPiUgdG9wX24oLTEwLCBwX3ZhbF9hZGopCmBgYAoKCgpgYGB7cn0Kd3JpdGVfbWFya2VycyhjbHVzdGVyLm1hcmtlcnMsIGhlcmUoJ3ZpZ25ldHRlcycsICdiY2VsbHMnLCAnZHJvcGxldF9jbHVzdGVyX21hcmtlcnMuY3N2JykpCmBgYAoKCmBgYHtyfQp0b3BfY2x1c3Rlcl9tYXJrZXJzID0gY2x1c3Rlci5tYXJrZXJzICU+JSBncm91cF9ieShjbHVzdGVyKSAlPiUgdG9wX24oLTEwLCBwX3ZhbF9hZGopCmBgYAoKCmBgYHtyLCBmaWcuaGVpZ2h0PTQwfQpuQ29sID0gNApwbG90cyA9IEZlYXR1cmVQbG90KHRpc3NfZHJvcGxldF9jZDE5LCBmZWF0dXJlcy5wbG90ID0gc29ydCh1bmlxdWUodG9wX2NsdXN0ZXJfbWFya2VycyRnZW5lKSksIAogICAgICAgICAgICAgICAgICAgIGRvLnJldHVybiA9IFRSVUUsIG5Db2wgPSBuQ29sLCBuby5heGVzPVRSVUUsIAogICAgICAgICAgICAgICAgICAgICMgTGlnaHQgZ3JleSB0byAKICAgICAgICAgICAgICAgICAgICBjb2xzLnVzZT1jKCdsaWdodGdyZXknLCAnIzAwODA4MCcpKQpmb3IgKHAgaW4gcGxvdHMpewogIGdlbmVfbmFtZSA9IHAkbGFiZWxzJHRpdGxlCiAgZ2VuZV90aXNzdWVzID0gdG9wX2NsdXN0ZXJfbWFya2VycyAlPiUgZmlsdGVyKGdlbmUgPT0gcCRsYWJlbHMkdGl0bGUpICU+JSBzZWxlY3QodGlzc3VlKQogIGdlbmVfdGlzc3VlcyA9IGFzLmNoYXJhY3Rlcihhcy52ZWN0b3IoZ2VuZV90aXNzdWVzJHRpc3N1ZSkpCiAgcHJpbnQocGFzdGUoZ2VuZV9uYW1lLCBwYXN0ZShnZW5lX3Rpc3N1ZXMpKSkKICB0aXRsZSA9IHBhc3RlMChnZW5lX25hbWUsICcgKCcsIHBhc3RlKGdlbmVfdGlzc3Vlcywgc2VwPScsICcpLCAnKScpCiAgcCA9IHAgKyBsYWJzKHRpdGxlPXRpdGxlKQogIHBsb3RzW1tnZW5lX25hbWVdXSA9IHAKfQpwbG90cy5jb21iaW5lZCA8LSBwbG90X2dyaWQocGxvdGxpc3QgPSBwbG90cywgbmNvbCA9IG5Db2wpCmludmlzaWJsZSh4ID0gbGFwcGx5KFggPSBwbG90cy5jb21iaW5lZCwgRlVOID0gcHJpbnQpKQpnZ3NhdmUoJ2Ryb3BsZXRfZmVhdHVyZXBsb3RfdG9wX2NsdXN0ZXJfbWFya2Vycy5wZGYnLCBoZWlnaHQgPSA0MCwgd2lkdGg9MTUpCmBgYAoKCgpgYGB7cn0Kb3JnYW5fbWFya2VycyA9IGZpbmRfbWFya2Vycyh0aXNzX2Ryb3BsZXRfY2QxOSwgJ3Rpc3N1ZScpCmhlYWQob3JnYW5fbWFya2VycykKYGBgCgpGaWx0ZXIgb25seSBmb3IgdGlzc3VlcyB3aXRoIGVub3VnaCBjZWxscwoKYGBge3J9CnRpc3N1ZV9jZWxsX2NvdW50cyA9IHRhYmxlKHRpc3NfZHJvcGxldF9jZDE5QG1ldGEuZGF0YSR0aXNzdWUpCnByaW50KHRpc3N1ZV9jZWxsX2NvdW50cykKCnRpc3N1ZXNfd2l0aF9lbm91Z2hfY2VsbHMgPSB0aXNzdWVfY2VsbF9jb3VudHNbdGlzc3VlX2NlbGxfY291bnRzID4gNTBdCnRpc3N1ZXNfd2l0aF9lbm91Z2hfY2VsbHMKYGBgCgoKYGBge3J9Cm9yZ2FuX21hcmtlcnNfZW5vdWdoX2NlbGxzID0gZmlsdGVyKG9yZ2FuX21hcmtlcnMsIHRpc3N1ZSAlaW4lIG5hbWVzKHRpc3N1ZXNfd2l0aF9lbm91Z2hfY2VsbHMpKQpvcmdhbl9tYXJrZXJzX2Vub3VnaF9jZWxscwpgYGAKCgpgYGB7cn0KdG9wX29yZ2FuX21hcmtlcnMgPSBvcmdhbl9tYXJrZXJzX2Vub3VnaF9jZWxscyAlPiUgZ3JvdXBfYnkodGlzc3VlKSAlPiUgdG9wX24oLTEwLCBwX3ZhbF9hZGopCnRvcF9vcmdhbl9tYXJrZXJzCmBgYAoKCmBgYHtyfQp3cml0ZV9jc3Yob3JnYW5fbWFya2Vyc19lbm91Z2hfY2VsbHMsIGhlcmUoJ3ZpZ25ldHRlcycsICdiY2VsbHMnLCAnZHJvcGxldF90aXNzdWVfbWFya2Vycy5jc3YnKSkKYGBgCgoKYGBge3J9CmdncGxvdChkYXRhPW9yZ2FuX21hcmtlcnNfZW5vdWdoX2NlbGxzLCBhZXMoeD1wX3ZhbCkpICsgZ2VvbV9oaXN0b2dyYW0oKSArIGZhY2V0X2dyaWQofnRpc3N1ZSkKYGBgCmBgYHtyfQpnZ3Bsb3QoZGF0YT1vcmdhbl9tYXJrZXJzX2Vub3VnaF9jZWxscywgYWVzKHg9cF92YWxfYWRqKSkgKyBnZW9tX2hpc3RvZ3JhbSgpICsgZmFjZXRfZ3JpZCh+dGlzc3VlKQpgYGAKCmBgYHtyfQp0b3Bfb3JnYW5fbWFya2VycyAlPiUgZmlsdGVyKGdlbmUgPT0gcCRsYWJlbHMkdGl0bGUpICU+JSBzZWxlY3QodGlzc3VlKQpgYGAKCgpgYGB7ciwgZmlnLmhlaWdodD00MH0KbkNvbCA9IDQKcGxvdHMgPSBGZWF0dXJlUGxvdCh0aXNzX2Ryb3BsZXRfY2QxOSwgZmVhdHVyZXMucGxvdCA9IHNvcnQodW5pcXVlKHRvcF9vcmdhbl9tYXJrZXJzJGdlbmUpKSwgCiAgICAgICAgICAgICAgICAgICAgZG8ucmV0dXJuID0gVFJVRSwgbkNvbCA9IG5Db2wsIG5vLmF4ZXM9VFJVRSwgCiAgICAgICAgICAgICAgICAgICAgIyBMaWdodCBncmV5IHRvIAogICAgICAgICAgICAgICAgICAgIGNvbHMudXNlPWMoJ2xpZ2h0Z3JleScsICcjMDA4MDgwJykpCmZvciAocCBpbiBwbG90cyl7CiAgZ2VuZV9uYW1lID0gcCRsYWJlbHMkdGl0bGUKICBnZW5lX3Rpc3N1ZXMgPSB0b3Bfb3JnYW5fbWFya2VycyAlPiUgZmlsdGVyKGdlbmUgPT0gcCRsYWJlbHMkdGl0bGUpICU+JSBzZWxlY3QodGlzc3VlKQogIGdlbmVfdGlzc3VlcyA9IGFzLmNoYXJhY3Rlcihhcy52ZWN0b3IoZ2VuZV90aXNzdWVzJHRpc3N1ZSkpCiAgcHJpbnQocGFzdGUoZ2VuZV9uYW1lLCBwYXN0ZShnZW5lX3Rpc3N1ZXMpKSkKICB0aXRsZSA9IHBhc3RlMChnZW5lX25hbWUsICcgKCcsIHBhc3RlKGdlbmVfdGlzc3Vlcywgc2VwPScsICcpLCAnKScpCiAgcCA9IHAgKyBsYWJzKHRpdGxlPXRpdGxlKQogIHBsb3RzW1tnZW5lX25hbWVdXSA9IHAKfQpwbG90cy5jb21iaW5lZCA8LSBwbG90X2dyaWQocGxvdGxpc3QgPSBwbG90cywgbmNvbCA9IG5Db2wpCmludmlzaWJsZSh4ID0gbGFwcGx5KFggPSBwbG90cy5jb21iaW5lZCwgRlVOID0gcHJpbnQpKQpnZ3NhdmUoJ2Ryb3BsZXRfZmVhdHVyZXBsb3RfdG9wX29yZ2FuX21hcmtlcnMucGRmJywgaGVpZ2h0ID0gNDAsIHdpZHRoPTE1KQpgYGAKCgo=